#include <stdio.h>
#include <stdlib.h>
#include "seqstack.h"


//1.创建一个空的栈
seqstack_t *CreateEpSeqStack(int len){//len代表的是创建栈的时候的最大长度
    seqstack_t* p=(seqstack_t*)malloc(sizeof(seqstack_t));
    if(p == NULL){
        printf("栈分配错误\n");
        return NULL;
    }
    p->data=(datatype*)malloc(sizeof(datatype)*len);
    if(p->data == NULL){
        printf("栈数据空间分配错误\n");
        free(p);
        p==NULL;
        return  NULL;
    }
    p->top=-1;
    p->maxlen=len;

}

//2.判断是否为满,满返回1 未满返回0
int IsFullSeqStack(seqstack_t *p){
    if(p == NULL){
        printf("栈头错误\n");
        return -1;
    }
    if(p->data == NULL){
        printf("栈数据空间错误\n");
        free(p);
        p==NULL;
        return  -1;
    }
    if(p->top == p->maxlen-1){
        printf("栈已满\n");
        return 1;
    }
    else{
        printf("栈未满\n");
        return 0;
    }

}

//3.入栈
int PushStack(seqstack_t *p, datatype data){//data代表入栈的数据
    if(p == NULL){
        printf("栈头错误\n");
        return -1;
    }
    if(p->top == p->maxlen-1){
        printf("栈已满\n");
        return -1;
    }
    if(p->data == NULL){
        printf("栈数据空间错误\n");
        return  -1;
    }
    p->top++;
    p->data[p->top]=data;
    printf("入栈成功\n");
    return 1;
}

//4.判断栈是否为空
int IsEpSeqStack(seqstack_t *p){
    if(p == NULL){
        printf("栈头错误\n");
        return -1;
    }
    if(p->data == NULL){
        printf("栈数据空间错误\n");
        return -1;
    }
    if(p->top == -1){
        printf("栈为空\n");
        return 0;
    }
    else{
        printf("栈不为空\n");
        return 1;
    }
}

//5.出栈
datatype PopSeqStack(seqstack_t *p){
    if(p == NULL){
        printf("栈头错误\n");
        return -1;
    }
    if(p->data == NULL){
        printf("栈数据空间错误\n");
        return -1;
    }
    if(p->top == -1){
        printf("栈为空\n");
        return -1;
    }
    p->top--;
    printf("出栈成功\n");
    return p->data[p->top+1];
    
}

//6. 清空栈
void ClearSeqStack(seqstack_t *p){
    if(p == NULL){
        printf("栈头错误\n");
        return;
    }
    p->top=-1;
}

//7. 获取栈顶数据(注意不是出栈操作，如果出栈，相当于删除了栈顶数据，只是将栈顶的数据获取到，不需要移动栈针)
datatype GetTopSeqStack(seqstack_t *p){
    if(p == NULL){
        printf("栈头错误\n");
        return -1;
    }
    if(p->data == NULL){
        printf("栈数据空间错误\n");
        return -1;
    }
    if(p->top == -1){
        printf("栈为空\n");
        return -1;
    }
    return p->data[p->top];
}

//8. 求栈的长度
int LengthSeqStack(seqstack_t *p){
    if(p == NULL){
        printf("栈头错误\n");
        return -1;
    }
    if(p->data == NULL){
        printf("栈数据空间错误\n");
        return -1;
    }
    if(p->top == -1){
        printf("栈为空\n");
        return -1;
    }
    return p->top+1;

}